//#include <iostream>
//using namespace std;
//
//int n;
//
//int main()
//{
//    cin >> n;
//    int left = 1;
//    int right = n;
//
//    while (left <= right)
//    {
//        cout << left << " ";
//        left++;
//        if (left <= right)
//        {
//            cout << right << " ";
//            right--;
//        }
//    }
//    return 0;
//}

//#include <iostream>
//#include <unordered_set>
//#include <vector>
//#include <algorithm>
//using namespace std;
//
//int m;
//int n;
//unordered_set<int> cnt;
//vector<int> ret;
//
//int main()
//{
//    cin >> m >> n;
//    int x = 0;
//    for (int i = 0; i < m; i++)
//    {
//        cin >> x;
//        cnt.insert(x);
//    }
//
//    for (int i = 0; i < n; i++)
//    {
//        cin >> x;
//        cnt.insert(x);
//    }
//
//    for (auto e : cnt)
//    {
//        ret.push_back(e);
//    }
//
//    sort(ret.begin(), ret.end());
//    for (int i = 0; i < ret.size() - 1; i++)
//    {
//        cout << ret[i] << " ";
//    }
//    cout << ret[ret.size() - 1];
//
//    return 0;
//}

//#include <iostream>
//#include <set>
//using namespace std;
//
//int n;
//int m;
//set<int> s;
//
//int main()
//{
//    cin >> n >> m;
//    int x = 0;
//    for (int i = 0; i < n; i++)
//    {
//        cin >> x;
//        s.insert(x);
//    }
//
//    for (int i = 0; i < m; i++)
//    {
//        cin >> x;
//        s.insert(x);
//    }
//
//    for (auto e : s)
//    {
//        cout << e << " ";
//    }
//
//    return 0;
//}
//
//#include <iostream>
//#include <algorithm>
//using namespace std;
//
//const int N = 1e4 + 10;
//int n;
//int m;
//int v1[N];
//int v2[N];
//
//int main()
//{
//    cin >> n >> m;
//    for (int i = 0; i < n; i++)
//    {
//        cin >> v1[i];
//    }
//
//    for (int i = 0; i < m; i++)
//    {
//        cin >> v2[i];
//    }
//
//    sort(v1, v1 + n);
//    sort(v2, v2 + m);
//
//    int p = 0;
//    int q = 0;
//
//    while (p < n && q < m)
//    {
//        if (v1[p] == v2[q])
//        {
//            p++;
//        }
//        else if (v1[p] > v2[q])
//        {
//            cout << v2[q] << " ";
//            q++;
//        }
//        else
//        {
//            cout << v1[p] << " ";
//            p++;
//        }
//    }
//
//    while (p < n)
//    {
//        cout << v1[p] << " ";
//        p++;
//    }
//
//    while (q < m)
//    {
//        cout << v2[q] << " ";
//        q++;
//    }
//
//    return 0;
//}
//
//#include <iostream>
//#include <string>
//using namespace std;
//
//const int N = 1e3 + 10;
//int dp[N][N];
//string str;
//
//int main()
//{
//    cin >> str;
//    int n = str.size();
//
//    for (int i = n - 1; i >= 0; i--)
//    {
//        for (int j = 0; j < n; j++)
//        {
//            if (i > j)
//            {
//                dp[i][j] = 0;
//            }
//            else if (i == j)
//            {
//                dp[i][j] = 1;
//            }
//            else
//            {
//                if (str[i] == str[j])
//                {
//                    dp[i][j] = 2 + dp[i + 1][j - 1];
//                }
//                else
//                {
//                    dp[i][j] = max(dp[i][j - 1], dp[i + 1][j]);
//                }
//            }
//        }
//    }
//
//    cout << dp[0][n - 1] << endl;
//    return 0;
//}

#include <iostream>
#include <string>
using namespace std;

const int N = 1e3 + 10;
int dp[N][N];
string str;

int main()
{
    cin >> str;
    int n = str.size();

    for (int i = n - 1; i >= 0; i--)
    {
        dp[i][i] = 1;
        for (int j = i + 1; j < n; j++)
        {
            if (str[i] == str[j])
            {
                dp[i][j] = 2 + dp[i + 1][j - 1];
            }
            else
            {
                dp[i][j] = max(dp[i][j - 1], dp[i + 1][j]);
            }
        }
    }

    cout << dp[0][n - 1] << endl;
    return 0;
}